package com.example.dynamicplanning;

/**
 * 面试题 08.01. 三步问题
 * 三步问题。有个小孩正在上楼梯，楼梯有n阶台阶，小孩一次可以上1阶、2阶或3阶。实现一种方法，计算小孩有多少种上楼梯的方式。结果可能很大，你需要对结果模1000000007。
 * <p>
 * 示例1:
 * <p>
 * 输入：n = 3
 * 输出：4
 * 说明: 有四种走法
 * 示例2:
 * <p>
 * 输入：n = 5
 * 输出：13
 * 提示:
 * <p>
 * n范围在[1, 1000000]之间
 * <p>
 * 思路：动态规划
 * 因为是有三个步态可以选择，所以初始化三个初始dp数组变量
 * 接着状态转移方程：最后一步可以走1/2/3步都可以，所以dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
 * <p>
 * 注意：之前的错误想法是最后一步加之前的步数是总台阶，就很容易绕进去。思路一定要改变。
 * <p>
 * 结果对其取模即可。
 */
public class ThreeStepsProblem {
    public int waysToStep(int n) {
        int[] dp = new int[n + 1];
        if (n == 1) return 1;
        if (n == 2) return 2;
        if (n == 3) return 4;
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        for (int i = 4; i <= n; i++) {
            dp[i] = ((dp[i - 1] + dp[i - 2]) % 1000000007 + dp[i - 3]) % 1000000007;
        }
        return dp[n];
    }
}

